﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Quiz.LINQData;

namespace Quiz
{
    /// <summary>
    /// Interaction logic for FrageListe.xaml
    /// </summary>
    public partial class FrageListe : Window, IDisposable
    {
        private DataBase _db;
        private Frage _currentFrage;

        /// <summary>
        /// Zeigt alle zur Verfügung stehenden Fragen an, welche von hier aus bearbeitet werden können.
        /// </summary>
        public FrageListe()
        {
            InitializeComponent();
            Init();
        }

        /// <summary>
        /// Initialisieren aller wichtigen Funktionen, für dieses Fenster.
        /// </summary>
        private void Init()
        {
            _db = new DataBase();
            this.DataContext = _db;

            _currentFrage = null;
            uxBearbeitenSP.DataContext = _currentFrage;
        }

        /// <summary>
        /// Beim Ändern der Kategorie müssen 2 Werte Geändert werden, welche sich nach aktuellen Kenntnisstand nicht über XAML realisieren lässt,
        /// daher diese Funktion.
        /// </summary>
        private void KategorieAendern()
        {
            if (_currentFrage != null)
            {
                _currentFrage.Kategorie = (Kategorie)uxKategorieKb.SelectedItem;
                _currentFrage.KategorieID = _currentFrage.Kategorie.KategorieID;
            }
        }

        private void uxListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            KategorieAendern();
            _currentFrage = (Frage)uxListBox.SelectedItem;
            uxBearbeitenSP.DataContext = _currentFrage;
        }

        /// <summary>
        /// Speichern aller vorgenommenen Änderungen an den Fragen
        /// </summary>
        private void uxSpeichern_Click(object sender, RoutedEventArgs e)
        {
            KategorieAendern();
            _db.Speichern();
        }

        /// <summary>
        /// Abbrechen der Bearbeitung
        /// </summary>
        private void uxAbbrechenBtn_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        /// <summary>
        /// Hinzufügen einer Neuen Frage
        /// </summary>
        private void uxHinzufuegenBtn_Click(object sender, RoutedEventArgs e)
        {
             //Öffnen des Fensterns in dem eine neue Frage inkl. antworten hinzugefügt werden kann.
             FrageHinzufuegen frageHinzufuegen = new FrageHinzufuegen();
             frageHinzufuegen.Closed += new EventHandler(frageHinzufuegen_Close);
             frageHinzufuegen.ShowDialog();
        }

        /// <summary>
        /// Löschen der aktuell ausgewählten Frage aus der Frageauflistung
        /// </summary>
        private void uxLoeschenBtn_Click(object sender, RoutedEventArgs e)
        {
            _currentFrage = (Frage)uxListBox.SelectedItem;
            if (_db.Frageloeschen(_currentFrage))
            {
                Init();
            }
        }

        /// <summary>
        /// Löscht alle Fragen aus der Auflistung
        /// </summary>
        private void uxAlleLoeschenBtn_Click(object sender, RoutedEventArgs e)
        {
            if (MessageBox.Show("Wollen Sie wirklich alle Fragen löschen?", "Bestätigungsdialog - ALLE Fragen löschen", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
            {
                //Alle Fragen heraussuchen und aus dem System löschen.
                var queryDel = from frage in _db.Fragen select frage;

                foreach (Frage eFrage in queryDel)
                {
                    _db.Frageloeschen(eFrage);
                }

                Init();
            }
        }

        /// <summary>
        /// Wird aufgerufen, wenn das modulare Fenster für Fragen Hinzufügen geschlossen wird.
        /// </summary>
        private void frageHinzufuegen_Close(object sender, EventArgs e)
        {
            Init();
        }

        /// <summary>
        /// Sobald sich die Eingabe in der suchentextbox ändert, den Inhalt der Listbox anpassen.
        /// </summary>
        private void uxSucheTextTb_KeyUp(object sender, KeyEventArgs e)
        {
            if (uxSucheTextTb.Text.Trim().Length == 0)
            {
                uxListBox.ItemsSource = _db.Fragen;
            }
            else
            {
                //Die Antwortliste anpassen, damit die Ergebnisliste zum String passt der eingegeben wurde.
                var queryFrage = from frage in _db.Fragen where frage.Fragetext.ToLower().Contains(uxSucheTextTb.Text.ToLower()) select frage;
                uxListBox.ItemsSource = queryFrage;
            }
        }

        private void uxKategorieHinzufuegenBtn_Click(object sender, RoutedEventArgs e)
        {
            //Öffnen des Fensterns in dem eine neue Frage inkl. antworten hinzugefügt werden kann.
            KategorieHinzufuegen kategorieHinzufuegen = new KategorieHinzufuegen();
            kategorieHinzufuegen.Closed += new EventHandler(kategorieHinzufuegen_Close);
            kategorieHinzufuegen.ShowDialog();
        }

        /// <summary>
        /// Wird aufgerufen, wenn das modulare Fenster für Kateogorien Hinzufügen geschlossen wird.
        /// </summary>
        private void kategorieHinzufuegen_Close(object sender, EventArgs e)
        {
            Init();
        }

        /// <summary>
        /// Die Db-Klasse verwerfen
        /// </summary>
        void IDisposable.Dispose()
        {
            _db.Dispose();
        }
    }
}
